package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.vo.Attributes;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.vo.GoodsTypeVo;
import com.atguigu.jxc.service.GoodsTypeService;
import com.atguigu.jxc.util.JxcException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description:
 * @Author: Gavin
 * @Date: 9/11/2023 4:55 PM
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    GoodsTypeDao goodsTypeDao;
    @Override
    public List<GoodsTypeVo> queryGoodsCategory() {
        //1.需要查询获取所有的GoodsType集合
        List<GoodsType> goodsTypes =  goodsTypeDao.queryAll();

        //2.现将所有的goodsTypes转换成GoodsTypeVo类型的集合,children先不用管
        if(CollectionUtils.isEmpty(goodsTypes)){
            return null;
        }

        List<GoodsTypeVo> goodsTypeVos = goodsTypes.stream().map(goodsType -> {
            //1.将GoodsType转换为对应的GoodsTypeVo对象
            GoodsTypeVo goodsTypeVo = new GoodsTypeVo();
            goodsTypeVo.setId(goodsType.getGoodsTypeId());
            goodsTypeVo.setText(goodsType.getGoodsTypeName());
            //如果goodsTypeState是1,那么就是closed,如果是0,那么就是open
            goodsTypeVo.setState(goodsType.getGoodsTypeState() == 1 ? "closed" : "open");
            goodsTypeVo.setAttributes(new Attributes(goodsType.getGoodsTypeState()));
            goodsTypeVo.setPid(goodsType.getPId());
            return goodsTypeVo;
        }).collect(Collectors.toList());

        List<GoodsTypeVo> targetGoodsTypeVos = new ArrayList<>();
        //构建树状的结构
        for (GoodsTypeVo goodsTypeVo : goodsTypeVos) {
            //递归的入口
            if(goodsTypeVo.getPid() == -1){
                targetGoodsTypeVos.add(buildGoodsTypeTree(goodsTypeVo, goodsTypeVos));
            }
        }
        return targetGoodsTypeVos;
    }

    @Override
    public void save(String goodsTypeName, Integer pid) {
        //子类的pid就是父类的id,需要查询下,如果当前的这个新增的子类的父类的type_state为0的话,需要修改为1
        GoodsType goodsType = goodsTypeDao.queryById(pid);
        if (goodsType.getGoodsTypeState() == 0){
            goodsType.setGoodsTypeState(1);
            goodsTypeDao.update(goodsType);
        }
        //最后的0是goods_type_state 如果为0表示是叶子节点
        goodsTypeDao.save(goodsTypeName,pid,0);
    }

    @Override
    public ServiceVO deleteById(Integer goodsTypeId) {
        //应该连同子分类也要一起删除的把,不行,不能这样
        List<GoodsType> goodsTypes = goodsTypeDao.queryGoodsTypesByPid(goodsTypeId);
        if (!CollectionUtils.isEmpty(goodsTypes)){
            //进来这里面说明当前要删除的分类的下面还有子节点,不能删除,抛出异常
            return new ServiceVO(ErrorCode.GOODS_TYPE_ERROR_CODE,ErrorCode.GOODS_TYPE_ERROR_MESS);
        }
        goodsTypeDao.deleteById(goodsTypeId);
        return new ServiceVO<>(SuccessCode.SUCCESS_CODE,SuccessCode.SUCCESS_MESS);
    }

    private  GoodsTypeVo buildGoodsTypeTree(GoodsTypeVo goodsTypeVo,List<GoodsTypeVo> goodsTypeVos) {
        goodsTypeVo.setChildren(new ArrayList<>());
        for (GoodsTypeVo typeVo : goodsTypeVos) {
            if (goodsTypeVo.getId() == typeVo.getPid()) {
                //下面就是程序递归的出口
                if(goodsTypeVo.getChildren() == null){
                    goodsTypeVo.setChildren(new ArrayList<>());
                }
                goodsTypeVo.getChildren().add(buildGoodsTypeTree(typeVo,goodsTypeVos));
            }
        }
        return goodsTypeVo;
    }
}
